﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ProyectoGrupo5.ClasesDominio;
using System.Data.SqlClient;
using System.Data;

//20/05/2011

namespace ProyectoGrupo5.Persistencia
{
    // La clase AvisoDAO Hereda (usa) la interface IAvisoDAO
    public class AvisoDAO : IAvisoDAO
    {
        //Atributos
        private String cadenaConexion = "Data Source=LOCALHOST;Initial Catalog=BOLSA_TRABAJO;User Id=PRUEBA;Password=prueba;";
        private SqlConnection conexion;
 
        public AvisoDAO()
        {
             conexion = new SqlConnection(cadenaConexion);
        }

        public Aviso CrearAviso(Aviso aviso)
        {
            Aviso existeA = this.VerificaCodigoAviso(aviso.CodigoAviso);
          if (existeA != null)
          {
              throw new Exception("El Aviso con CODIGO " + aviso.CodigoAviso + " ya existe!");
          }
          else
          {
              Ofertante existeC = this.VerificaCodigoOfertante(aviso.Ofertante.CodigoOfertante);
              if (existeC == null)
              {
                  throw new Exception("El Ofertante con CODIGO " + aviso.Ofertante.CodigoOfertante + " No existe!");
              }
              else
              {
               conexion.Open();
               //Creamos nuestra Sentencia Insert
               String sentencia = "Insert Into AVISO Values(@ca,@tt,@fi,@de,@dp,@co,@ff);";
               SqlCommand comando = new SqlCommand(sentencia, conexion);
               //Agregamos nuestros parametros a nuestra consulta 
               comando.Parameters.Add(new SqlParameter("@ca", SqlDbType.Int)).Value      = aviso.CodigoAviso;
               comando.Parameters.Add(new SqlParameter("@tt", SqlDbType.NVarChar)).Value = aviso.Titulo;
               comando.Parameters.Add(new SqlParameter("@fi", SqlDbType.DateTime)).Value = aviso.FechaInicio;
               comando.Parameters.Add(new SqlParameter("@de", SqlDbType.NVarChar)).Value = aviso.DescripcionEmpresa;
               comando.Parameters.Add(new SqlParameter("@dp", SqlDbType.NVarChar)).Value = aviso.DescripcionPuesto;
               comando.Parameters.Add(new SqlParameter("@co", SqlDbType.Int)).Value      = aviso.Ofertante.CodigoOfertante;
               comando.Parameters.Add(new SqlParameter("@ff", SqlDbType.DateTime)).Value = aviso.FechaFin;
               //Ejecutamos Consulta
               comando.ExecuteNonQuery();
               conexion.Close();
               return this.ObtenerAviso(aviso.CodigoAviso); //TODO: Queda pendiente de devolver objeto creado
              }
           }
        }

        public Aviso VerificaCodigoAviso(Int32 codigo)
        {
            conexion.Open();
            String sentencia = "Select * From AVISO Where CodigoAviso=@ca";
            SqlCommand comando = new SqlCommand(sentencia, conexion);
            comando.Parameters.Add(new SqlParameter("@ca", SqlDbType.Int)).Value = codigo;
            SqlDataReader resultado = comando.ExecuteReader();
            Aviso aviso = null;
            if (resultado.HasRows) //Si el resultado tiene filas
            {
                aviso = new Aviso();
                resultado.Read(); //Avanzar el índice de la lista de la fila 0 a la fila 1
                aviso.CodigoAviso = (Int32)resultado["codigoaviso"];
            }
            resultado.Close();
            conexion.Close();
            return aviso;
        }

        public Ofertante VerificaCodigoOfertante(Int32 codigo)
        {
            conexion.Open();
            String sentencia = "Select * From OFERTANTE Where CodigoOfertante=@co";
            SqlCommand comando = new SqlCommand(sentencia, conexion);
            comando.Parameters.Add(new SqlParameter("@co", SqlDbType.Int)).Value = codigo;
            SqlDataReader resultado = comando.ExecuteReader();
            Ofertante ofertante = null;
            if (resultado.HasRows) //Si el resultado tiene filas
            {
                ofertante = new Ofertante();
                resultado.Read(); //Avanzar el índice de la lista de la fila 0 a la fila 1
                ofertante.CodigoOfertante = (Int32)resultado["codigoofertante"];
            }
            resultado.Close();
            conexion.Close();
            return ofertante;
        }
        
        public Aviso ObtenerAviso(Int32 codigo)
        {
          Aviso existeA = this.VerificaCodigoAviso(codigo);
          if (existeA == null)
          {
              throw new Exception("El Aviso con CODIGO " + codigo + " No existe!");
          }
          else
          {
              conexion.Open();
              Aviso aviso = new Aviso();
              Ofertante ofertante = new Ofertante();
              aviso.Ofertante = ofertante;
  
              String sentencia = "Select * From AVISO Where CodigoAviso=@ca";
              SqlCommand comando = new SqlCommand(sentencia, conexion);
              comando.Parameters.Add(new SqlParameter("@ca", SqlDbType.Int)).Value = codigo;
              //Obtenemos filas del origen de datos
              SqlDataReader resultado = comando.ExecuteReader();
              if (resultado.HasRows) //Si el resultado tiene filas, llenamos el objeto
              {
                  resultado.Read(); //Avanzar el índice de la lista de la fila 0 a la fila 1
                  aviso.CodigoAviso               = (Int32)resultado["codigoaviso"];
                  aviso.Titulo                    = (String)resultado["titulo"];
                  aviso.FechaInicio               = (DateTime)resultado["fechainicio"];
                  aviso.DescripcionEmpresa        = (String)resultado["descripcionempresa"];
                  aviso.DescripcionPuesto         = (String)resultado["descripcionpuesto"];
                  aviso.Ofertante.CodigoOfertante = (Int32)resultado["codigoofertante"];
                  aviso.FechaFin                  = (DateTime)resultado["fechafin"];
              }
              resultado.Close();
              conexion.Close();
              return aviso;
          }
       }

        public Aviso ModificarAviso(Aviso aviso)
        {
            Aviso existeC = this.VerificaCodigoAviso(aviso.CodigoAviso);
            if (existeC == null)
            {
                throw new Exception("El Aviso con CODIGO " + aviso.CodigoAviso + " No existe!");
            }
            else
            {
                conexion.Open();
                String sentencia = "Update AVISO Set "
                + "Titulo=@tt, FechaInicio=@fi, DescripcionEmpresa=@de, DescripcionPuesto=@dp, CodigoOfertante=@co, FechaFin=@ff "
                + "Where CodigoAviso=@ca";
                SqlCommand comando = new SqlCommand(sentencia, conexion);
                //Agregamos nuestros parametros a nuestra consulta 
                comando.Parameters.Add(new SqlParameter("@ca", SqlDbType.Int)).Value      = aviso.CodigoAviso;
                comando.Parameters.Add(new SqlParameter("@tt", SqlDbType.NVarChar)).Value = aviso.Titulo;
                comando.Parameters.Add(new SqlParameter("@fi", SqlDbType.DateTime)).Value = aviso.FechaInicio;
                comando.Parameters.Add(new SqlParameter("@de", SqlDbType.NVarChar)).Value = aviso.DescripcionEmpresa;
                comando.Parameters.Add(new SqlParameter("@dp", SqlDbType.NVarChar)).Value = aviso.DescripcionPuesto;
                comando.Parameters.Add(new SqlParameter("@co", SqlDbType.Int)).Value      = aviso.Ofertante.CodigoOfertante;
                comando.Parameters.Add(new SqlParameter("@ff", SqlDbType.DateTime)).Value = aviso.FechaFin;
                //Ejecutamos Consulta
                comando.ExecuteNonQuery();
                conexion.Close();
                return this.ObtenerAviso(aviso.CodigoAviso); //TODO: Queda pendiente de devolver objeto creado
            }
        }

        public void EliminarAviso(Int32 codigo)
        {
            Aviso existeA = this.VerificaCodigoAviso(codigo);
            if (existeA == null)
            {
                throw new Exception("El Aviso con CODIGO " + codigo + " No existe!");
            }
            else
            {
                conexion.Open();
                String sentencia = "Delete From AVISO Where CodigoAviso=@ca";
                SqlCommand comando = new SqlCommand(sentencia, conexion);
                comando.Parameters.Add(new SqlParameter("@ca", SqlDbType.NVarChar)).Value = codigo;
                comando.ExecuteNonQuery();
                conexion.Close();
            }
        }
        public ICollection<Aviso> ListarAvisosTodos()
        {
            List<Aviso> listaAviso = new List<Aviso>();

            conexion.Open();
            String sentencia = "Select * From AVISO";
            SqlCommand comando = new SqlCommand(sentencia, conexion);
            SqlDataReader resultado = comando.ExecuteReader();
            Aviso aviso = null;
            while (resultado.Read()) //Si el resultado tiene filas
            {
                aviso = new Aviso();
                aviso.CodigoAviso = (Int32)resultado["codigoaviso"];
                aviso.Titulo = (String)resultado["titulo"];
                aviso.DescripcionEmpresa = (String)resultado["descripcionempresa"];
                aviso.DescripcionPuesto = (String)resultado["descripcionpuesto"];
                aviso.FechaFin = (DateTime)resultado["fechafin"];
                listaAviso.Add(aviso);
            }
            resultado.Close();
            conexion.Close();
            return listaAviso;
        }
    }
}